home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / chrome / browser.jar / content / browser / metaData.js < prev    next >
Text File  |  2006-07-18  |  15KB  |  530 lines

  1. //@line 41 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/base/content/metaData.js"
  2.  
  3. const XLinkNS = "http://www.w3.org/1999/xlink";
  4. const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  5. const XMLNS = "http://www.w3.org/XML/1998/namespace";
  6. const XHTMLNS = "http://www.w3.org/1999/xhtml";
  7. var gMetadataBundle;
  8. var gLangBundle;
  9. var gRegionBundle;
  10. var nodeView;
  11. var htmlMode = false;
  12.  
  13. var onLink   = false;
  14. var onImage  = false;
  15. var onInsDel = false;
  16. var onQuote  = false;
  17. var onMisc   = false;
  18. var onTable  = false;
  19. var onTitle  = false;
  20. var onLang   = false;
  21.  
  22. const nsICacheService = Components.interfaces.nsICacheService;
  23. const cacheService = Components.classes["@mozilla.org/network/cache-service;1"]
  24.                      .getService(nsICacheService);
  25. var httpCacheSession = cacheService.createSession("HTTP", 0, true);
  26. httpCacheSession.doomEntriesIfExpired = false;
  27. var ftpCacheSession = cacheService.createSession("FTP", 0, true);
  28. ftpCacheSession.doomEntriesIfExpired = false;
  29.  
  30.  
  31. function onLoad()
  32. {
  33.   gMetadataBundle = document.getElementById("bundle_metadata");
  34.   gLangBundle = document.getElementById("bundle_languages");
  35.   gRegionBundle = document.getElementById("bundle_regions");
  36.   
  37.   showMetadataFor(window.arguments[0]);
  38.   nodeView = window.arguments[0].ownerDocument.defaultView;
  39. }
  40.  
  41. function showMetadataFor(elem)
  42. {
  43.   // skip past non-element nodes
  44.   while (elem && elem.nodeType != Node.ELEMENT_NODE)
  45.     elem = elem.parentNode;
  46.  
  47.   if (!elem) {
  48.     alert(gMetadataBundle.getString("unableToShowProps"));
  49.     window.close();
  50.   }
  51.  
  52.   if (elem.ownerDocument.getElementsByName && !elem.ownerDocument.namespaceURI)
  53.     htmlMode = true;
  54.   
  55.   // htmllocalname is "" if it's not an html tag, or the name of the tag if it is.
  56.   var htmllocalname = "";
  57.   if (isHTMLElement(elem,"")) { 
  58.     htmllocalname = elem.localName.toLowerCase();
  59.   }
  60.   
  61.   // We only look for images once
  62.   checkForImage(elem, htmllocalname);
  63.   
  64.   // Walk up the tree, looking for elements of interest.
  65.   // Each of them could be at a different level in the tree, so they each
  66.   // need their own boolean to tell us to stop looking.
  67.   while (elem && elem.nodeType == Node.ELEMENT_NODE) {
  68.     htmllocalname = "";
  69.     if (isHTMLElement(elem,"")) { 
  70.       htmllocalname = elem.localName.toLowerCase();
  71.     }
  72.  
  73.     if (!onLink)   checkForLink(elem, htmllocalname);
  74.     if (!onInsDel) checkForInsDel(elem, htmllocalname);
  75.     if (!onQuote)  checkForQuote(elem, htmllocalname);
  76.     if (!onTable)  checkForTable(elem, htmllocalname);
  77.     if (!onTitle)  checkForTitle(elem, htmllocalname);
  78.     if (!onLang)   checkForLang(elem, htmllocalname);
  79.       
  80.     elem = elem.parentNode;
  81.   }
  82.   
  83.   // Decide which sections to show
  84.   var onMisc = onTable || onTitle || onLang;
  85.   if (!onMisc)   hideNode("misc-sec");
  86.   if (!onLink)   hideNode("link-sec");
  87.   if (!onImage)  hideNode("image-sec");
  88.   if (!onInsDel) hideNode("insdel-sec");
  89.   if (!onQuote)  hideNode("quote-sec");
  90.  
  91.   // Fix the Misc section visibilities
  92.   if (onMisc) {
  93.     if (!onTable) hideNode("misc-tblsummary");
  94.     if (!onLang)  hideNode("misc-lang");
  95.     if (!onTitle) hideNode("misc-title");
  96.   }
  97.  
  98.   // Get rid of the "No properties" message. This is a backstop -
  99.   // it should really never show, as long as nsContextMenu.js's
  100.   // checking doesn't get broken.
  101.   if (onLink || onImage || onInsDel || onQuote || onMisc)
  102.     hideNode("no-properties")
  103. }
  104.  
  105.  
  106. function checkForImage(elem, htmllocalname)
  107. {
  108.   var img;
  109.   var imgType; // "img" = <img>
  110.                // "object" = <object>
  111.                // "input" = <input type=image>
  112.                // "background" = css background (to be added later)
  113.   var ismap = false;
  114.  
  115.   if (htmllocalname === "img") {
  116.     img = elem;
  117.     imgType = "img";
  118.  
  119.   } else if (htmllocalname === "object" &&
  120.              elem.type.substring(0,6) == "image/" &&
  121.              elem.data) {
  122.     img = elem;
  123.     imgType = "object";
  124.  
  125.   } else if (htmllocalname === "input" &&
  126.              elem.type.toUpperCase() == "IMAGE") {
  127.     img = elem;
  128.     imgType = "input";
  129.  
  130.   } else if (htmllocalname === "area" || htmllocalname === "a") {
  131.  
  132.     // Clicked in image map?
  133.     var map = elem;
  134.     ismap = true;
  135.     setAlt(map);
  136.  
  137.     while (map && map.nodeType == Node.ELEMENT_NODE && !isHTMLElement(map,"map") )
  138.       map = map.parentNode;
  139.  
  140.     if (map && map.nodeType == Node.ELEMENT_NODE) {
  141.       img = getImageForMap(map);
  142.       var imgLocalName = img && img.localName.toLowerCase();
  143.       if (imgLocalName == "img" || imgLocalName == "object")
  144.           imgType = imgLocalName;
  145.     }
  146.   }
  147.  
  148.   if (img) {
  149.  
  150.     var imgURL = imgType == "object" ? img.data : img.src;
  151.     setInfo("image-url", imgURL);
  152.     var size = getSize(imgURL);
  153.  
  154.     if (size != -1) {
  155.       var kbSize = size / 1024;
  156.       kbSize = Math.round(kbSize*100)/100;
  157.       setInfo("image-filesize", gMetadataBundle.getFormattedString("imageSize", [kbSize, size]));
  158.     } else {
  159.       setInfo("image-filesize", gMetadataBundle.getString("imageSizeUnknown"));
  160.     }
  161.     if ("width" in img && img.width != "") {
  162.       setInfo("image-width", gMetadataBundle.getFormattedString("imageWidth", [ img.width ]));
  163.       setInfo("image-height", gMetadataBundle.getFormattedString("imageHeight", [ img.height ]));
  164.     }
  165.     else {
  166.       setInfo("image-width", "");
  167.       setInfo("image-height", "");
  168.     }        
  169.      
  170.     if (imgType == "img") {
  171.       setInfo("image-desc", img.longDesc);
  172.     } else {
  173.       setInfo("image-desc", "");
  174.     }
  175.     
  176.     onImage = true;
  177.   }
  178.  
  179.   if (!ismap) {
  180.    if (imgType == "img" || imgType == "input") {
  181.      setAlt(img);
  182.    } else {
  183.      hideNode("image-alt");
  184.    }
  185.   }
  186. }
  187.  
  188. function checkForLink(elem, htmllocalname)
  189. {
  190.   if ((htmllocalname === "a" && elem.href != "") ||
  191.     htmllocalname === "area") {
  192.  
  193.     setInfo("link-lang", convertLanguageCode(elem.getAttribute("hreflang")));
  194.     setInfo("link-url",  elem.href);
  195.     setInfo("link-type", elem.getAttribute("type"));
  196.     setInfo("link-rel",  elem.getAttribute("rel"));
  197.     setInfo("link-rev",  elem.getAttribute("rev"));
  198.  
  199.     var target = elem.target;
  200.  
  201.     switch (target) {
  202.     case "_top":
  203.       setInfo("link-target", gMetadataBundle.getString("sameWindowText"));
  204.       break;
  205.     case "_parent":
  206.       setInfo("link-target", gMetadataBundle.getString("parentFrameText"));
  207.       break;
  208.     case "_blank":
  209.       setInfo("link-target", gMetadataBundle.getString("newWindowText"));
  210.       break;
  211.     case "":
  212.     case "_self":
  213.       if (elem.ownerDocument.defaultView) {
  214.         if (elem.ownerDocument != elem.ownerDocument.defaultView.content.document)
  215.           setInfo("link-target", gMetadataBundle.getString("sameFrameText"));
  216.         else
  217.           setInfo("link-target", gMetadataBundle.getString("sameWindowText"));
  218.       } else {
  219.         hideNode("link-target");
  220.       }
  221.       break;
  222.     default:
  223.       setInfo("link-target", "\"" + target + "\"");
  224.     }
  225.  
  226.     onLink = true;
  227.   }
  228.  
  229.   else if (elem.getAttributeNS(XLinkNS, "href") != "") {
  230.     var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  231.                               .getService(Components.interfaces.nsIIOService);
  232.     var url = elem.getAttributeNS(XLinkNS, "href");
  233.     try {
  234.         var baseURI = ioService.newURI(elem.baseURI, elem.ownerDocument.characterSet, null);
  235.         url = ioService.newURI(url, elem.ownerDocument.characterSet, baseURI).spec;
  236.     } catch (e) {}
  237.     setInfo("link-url", url);
  238.     setInfo("link-lang", "");
  239.     setInfo("link-type", "");
  240.     setInfo("link-rel", "");
  241.     setInfo("link-rev", "");
  242.  
  243.     switch (elem.getAttributeNS(XLinkNS,"show")) {
  244.     case "embed":
  245.         setInfo("link-target", gMetadataBundle.getString("embeddedText"));
  246.         break;
  247.     case "new":
  248.         setInfo("link-target", gMetadataBundle.getString("newWindowText"));
  249.         break;
  250.     case "":
  251.     case "replace":
  252.         if (elem.ownerDocument != elem.ownerDocument.defaultView.content.document)
  253.             setInfo("link-target", gMetadataBundle.getString("sameFrameText"));
  254.         else
  255.             setInfo("link-target", gMetadataBundle.getString("sameWindowText"));
  256.         break;
  257.     default:
  258.         setInfo("link-target", "");
  259.         break;
  260.     }
  261.     
  262.     onLink = true;
  263.   }
  264. }
  265.  
  266. function checkForInsDel(elem, htmllocalname)
  267. {
  268.   if ((htmllocalname === "ins" || htmllocalname === "del") &&
  269.     (elem.cite || elem.dateTime)) {
  270.     setInfo("insdel-cite", elem.cite);
  271.     setInfo("insdel-date", elem.dateTime);
  272.     onInsDel = true;
  273.   } 
  274. }
  275.  
  276.  
  277. function checkForQuote(elem, htmllocalname)
  278. {
  279.   if ((htmllocalname === "q" || htmllocalname === "blockquote") && elem.cite) {
  280.     setInfo("quote-cite", elem.cite);
  281.     onQuote = true;
  282.   } 
  283. }
  284.  
  285. function checkForTable(elem, htmllocalname)
  286. {
  287.   if (htmllocalname === "table" && elem.summary) {
  288.     setInfo("misc-tblsummary", elem.summary);
  289.     onTable = true;
  290.   }
  291. }
  292.  
  293. function checkForLang(elem, htmllocalname)
  294. {
  295.   if ((htmllocalname && elem.lang) || elem.getAttributeNS(XMLNS, "lang")) {
  296.     var abbr;
  297.     if (htmllocalname && elem.lang)
  298.       abbr = elem.lang;
  299.     else
  300.       abbr = elem.getAttributeNS(XMLNS, "lang");
  301.         
  302.     setInfo("misc-lang", convertLanguageCode(abbr));
  303.     onLang = true;
  304.   }
  305. }
  306.     
  307. function checkForTitle(elem, htmllocalname)
  308. {
  309.   if (htmllocalname && elem.title) {
  310.     setInfo("misc-title", elem.title);
  311.     onTitle = true;
  312.   }    
  313. }
  314.  
  315. /*
  316.  * Set text of node id to value
  317.  * if value="" the node with specified id is hidden.
  318.  * Node should be have one of these forms
  319.  * <xul:label id="id-text" value=""/>
  320.  * <xul:description id="id-text"/>
  321.  */
  322. function setInfo(id, value)
  323. {
  324.   if (!value) {
  325.     hideNode(id);
  326.     return;
  327.   }
  328.  
  329.   var node = document.getElementById(id+"-text");
  330.  
  331.   if (node.namespaceURI == XULNS && node.localName == "label" ||
  332.      (node.namespaceURI == XULNS && node.localName == "textbox")) {
  333.     node.setAttribute("value",value);
  334.  
  335.   } else if (node.namespaceURI == XULNS && node.localName == "description") {
  336.     while (node.hasChildNodes())
  337.       node.removeChild(node.firstChild);
  338.     node.appendChild(node.ownerDocument.createTextNode(value));
  339.   }
  340. }
  341.  
  342. // Hide node with specified id
  343. function hideNode(id)
  344. {
  345.     var style = document.getElementById(id).getAttribute("style");
  346.     document.getElementById(id).setAttribute("style", "display:none;" + style);
  347. }
  348.  
  349. /*
  350.  * Find <img> or <object> which uses an imagemap.
  351.  * If more then one object is found we can't determine which one
  352.  * was clicked.
  353.  *
  354.  * This code has to be changed once bug 1882 is fixed.
  355.  * Once bug 72527 is fixed this code should use the .images collection.
  356.  */
  357. function getImageForMap(map)
  358. {
  359.   var mapuri = "#" + map.getAttribute("name");
  360.   var multipleFound = false;
  361.   var img;
  362.  
  363.   var list = getHTMLElements(map.ownerDocument, "img");
  364.   for (var i=0; i < list.length; i++) {
  365.     if (list.item(i).getAttribute("usemap") == mapuri) {
  366.       if (img) {
  367.         multipleFound = true;
  368.         break;
  369.       } else {
  370.         img = list.item(i);
  371.         imgType = "img";
  372.       }
  373.     }
  374.   }
  375.  
  376.   list = getHTMLElements(map.ownerDocument, "object");
  377.   for (i = 0; i < list.length; i++) {
  378.     if (list.item(i).getAttribute("usemap") == mapuri) {
  379.       if (img) {
  380.         multipleFound = true;
  381.         break;
  382.       } else {
  383.         img = list.item(i);
  384.         imgType = "object";
  385.       }
  386.     }
  387.   }
  388.  
  389.   if (multipleFound)
  390.     img = null;
  391.  
  392.   return img;
  393. }
  394.  
  395. function getHTMLElements(node, name)
  396. {
  397.   if (htmlMode)
  398.     return node.getElementsByTagName(name);
  399.   return node.getElementsByTagNameNS(XHTMLNS, name);
  400. }
  401.  
  402. // name should be in lower case
  403. function isHTMLElement(node, name)
  404. {
  405.   if (node.nodeType != Node.ELEMENT_NODE)
  406.     return false;
  407.  
  408.   if (htmlMode)
  409.     return !name || node.localName.toLowerCase() == name;
  410.  
  411.   return (!name || node.localName == name) && node.namespaceURI == XHTMLNS;
  412. }
  413.  
  414. // This function coded according to the spec at:
  415. // http://www.bath.ac.uk/~py8ieh/internet/discussion/metadata.txt
  416. function convertLanguageCode(abbr)
  417. {
  418.   if (!abbr) return "";
  419.   var result;
  420.   var language = "";
  421.   var region;
  422.   var is_region_set = false;
  423.   var tokens = abbr.split("-");
  424.  
  425.   if (tokens[0] === "x" || tokens[0] === "i")
  426.   {
  427.     // x and i prefixes mean unofficial ones. So we upper-case the first
  428.     // word and leave the rest.
  429.     tokens.shift();
  430.  
  431.     if (tokens[0])
  432.     {
  433.       // Upper-case first letter
  434.       language = tokens[0].substr(0, 1).toUpperCase() + tokens[0].substr(1);
  435.       tokens.shift();
  436.  
  437.       if (tokens[0])
  438.       {
  439.         // Add on the rest as space-separated strings inside the brackets
  440.         region = tokens.join(" ");
  441.         is_region_set = true;
  442.       }
  443.     }
  444.   }
  445.   else
  446.   {
  447.     // Otherwise we treat the first as a lang, the second as a region
  448.     // and the rest as strings.
  449.     try
  450.     {
  451.       language = gLangBundle.getString(tokens[0]);
  452.     }
  453.     catch (e) 
  454.     {
  455.       // Language not present in lang bundle
  456.       language = tokens[0]; 
  457.     }
  458.  
  459.     tokens.shift();
  460.  
  461.     if (tokens[0])
  462.     {
  463.       try
  464.       {
  465.         // We don't add it on to the result immediately
  466.         // because we want to get the spacing right.
  467.         region = gRegionBundle.getString(tokens[0].toLowerCase());
  468.  
  469.         tokens.shift();
  470.  
  471.         if (tokens[0])
  472.         {
  473.           // Add on the rest as space-separated strings inside the brackets
  474.           region += " " + tokens.join(" ");
  475.         }
  476.       }
  477.       catch (e) 
  478.       {
  479.         // Region not present in region bundle
  480.         region = tokens.join(" ");
  481.       }
  482.  
  483.       is_region_set = true;
  484.     }
  485.   }
  486.  
  487.   if (is_region_set) {
  488.     result = gMetadataBundle.getFormattedString("languageRegionFormat",
  489.                                                 [language, region]);
  490.   } else
  491.     result = language;
  492.  
  493.   return result;
  494. }
  495.  
  496. // Returns the size of the URL in bytes; must be cached and therefore an HTTP or FTP URL
  497. function getSize(url) {
  498.   try
  499.   {
  500.     var cacheEntryDescriptor = httpCacheSession.openCacheEntry(url, Components.interfaces.nsICache.ACCESS_READ, false);
  501.     if(cacheEntryDescriptor)
  502.       return cacheEntryDescriptor.dataSize;
  503.   }
  504.   catch(ex) {}
  505.   try
  506.   {
  507.     cacheEntryDescriptor = ftpCacheSession.openCacheEntry(url, Components.interfaces.nsICache.ACCESS_READ, false);
  508.     if (cacheEntryDescriptor)
  509.       return cacheEntryDescriptor.dataSize;
  510.   }
  511.   catch(ex) {}
  512.   return -1;
  513. }
  514.  
  515. function setAlt(elem) {
  516.   var altText = document.getElementById("image-alt-text");
  517.   if (elem.hasAttribute("alt")) {
  518.     if (elem.alt != "") {
  519.       altText.value = elem.alt;
  520.       altText.setAttribute("style","font-style:inherit");
  521.     } else {
  522.       altText.value = gMetadataBundle.getString("altTextBlank");
  523.       altText.setAttribute("style","font-style:italic");
  524.     }
  525.   } else {
  526.     altText.value = gMetadataBundle.getString("altTextMissing");
  527.     altText.setAttribute("style","font-style:italic");
  528.   }
  529. }
  530.